package atguigu.crowd.mvc.handler;

import atguigu.crowd.constant.CrowdConstant;
import atguigu.crowd.service.dao.AdminService;
import com.atguigu.crowd.config.Admin;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;
import java.util.Objects;

@Controller
public class AdminHandler {

    @Autowired
    private AdminService adminService;

    /**
     * 用于页面转发的，点击编辑按钮，跳转到编辑页面，主要是获取页面数据
     * @param loginAcct
     * @param userName
     * @param email
     * @param session
     * @return
     */
    @RequestMapping("/admin/edit/{loginAcct}/{userName}/{email}.html")
    public String updateSkip(@PathVariable("loginAcct") String loginAcct,
                         @PathVariable("userName") String userName,
                         @PathVariable("email") String email,
                         HttpSession session) {
        // 更新数据
        Admin admin = new Admin(null, loginAcct, null, userName, email, null);

        session.setAttribute("admin", admin);
        // 重定向到分页页面
        return "admin-edit";
    }

    @RequestMapping("/admin/edit.html")
    public String update(Admin admin) {
        // 更新数据
        adminService.updateAdmin(admin);

        // 重定向到分页页面
        return "redirect:/admin/get/page.html";
    }

    @RequestMapping("/admin/add.html")
    public String add(@RequestParam("loginAcct") String loginAcct,
                      @RequestParam("userName") String userName,
                      @RequestParam("email") String email,
                      @RequestParam("userPswd") String userPswd) {
        // 获得用户的账号，匹配数据库是否重复，同时执行保存
        adminService.saveAdmin(new Admin(null, loginAcct, userPswd, userName, email, null));

        // 重定向到分页页面，使用重定向是为了避免刷新浏览器重复提交表单
        return "redirect:/admin/get/page.html?pageNum=" + Integer.MAX_VALUE;
    }

    /**
     * 删除管理员账号
     *
     * @param adminId
     * @param pageNum
     * @param keyword
     * @return
     */
    @RequestMapping("/admin/remove/{adminId}/{pageNum}/{keyword}.html")
    public String remove(@PathVariable("adminId") Integer adminId,
                         @PathVariable("pageNum") Integer pageNum,
                         @PathVariable("keyword") String keyword) {
        // 执行删除
        adminService.remove(adminId);
        Logger logger = LoggerFactory.getLogger(AdminHandler.class);
        logger.info("1234567890");

        // 页面跳转：回到分页页面
        return "redirect:/admin/get/page.html?pageNum=" + pageNum + "&keyword=" + keyword;
    }

    /**
     * 用于登录验证
     *
     * @param loginAcct
     * @param userPswd
     * @param session
     * @return
     */
    @RequestMapping("/admin/do/login.html")
    public String doLogin(@RequestParam("loginAcct") String loginAcct,
                          @RequestParam("userPswd") String userPswd,
                          HttpSession session) {
        // 调用 Service 方法执行登录检查
        // 这个方法如果能够返回 admin 对象说明登录成功，如果账号、密码不正确则会抛出异常
        Admin admin = adminService.getAdminByLoginAcct(loginAcct, userPswd);
        // 将登录成功返回的 admin 对象存入 Session 域
        session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN, admin);
        // 这里返回的是一个视图，因为配置了视图解析器，没配的话就必须返回视图
        return "redirect:/admin/to/main/page.html";
    }

    @RequestMapping("admin/do/logout.html")
    public String doLogout(HttpSession session) {
        // 强制session失效
        session.invalidate();
        return "redirect:/admin/to/login/page.html";
    }

//    @PreAuthorize("hasRole('部长')")          // 需要部长的角色
    @RequestMapping("/admin/get/page.html")   // 请求未携带就使用默认值 默认第一页 浏览器未提供 pageSize 时，默认每页显示 5 条记录
    public String getAdminPage(@RequestParam(value = "keyword", defaultValue = "") String keyword,
                               @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                               @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
                               ModelMap modelMap) {
        // 注意：页面上有可能不提供关键词，要进行适配
        // 在@RequestParam注解中设置defaultValue属性为空字符串表示浏览器不提供关键词时，keyword 变量赋值为空字符串
        // 查询得到分页数据
        PageInfo<Admin> pageInfo = null;
        if (Objects.equals("-1", keyword)) {
            pageInfo = adminService.getAdminPage("", pageNum, pageSize);
        } else {
            pageInfo = adminService.getAdminPage(keyword, pageNum, pageSize);
        }
        // 将分页数据存入模型
        modelMap.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO, pageInfo);
        return "admin-page";
    }
}
